home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu358.dms / pu358.adf / DonsGenies / Don'sGenies / BordersRepeats.pprx < prev    next >
Text File  |  1992-07-16  |  9KB  |  300 lines

  1. /* This Genie puts a decorative border around a box. You will need a box containing a clip or bitmap for the corners, and one or more similar boxes for the sides. The resulting border consists of a group of individual boxes, which can be moved together if you hold down the shift key.
  2. Written by Don Cox  July '92 */
  3.  
  4.  
  5.  
  6. address command
  7. signal on error
  8. signal on syntax
  9. signal on halt
  10. signal on break_c
  11. signal on break_d
  12. signal on break_e
  13.  
  14. rad = 3.1415926 / 180
  15. call ppm_AutoUpdate(0)
  16. call SafeEndEdit.rexx()
  17. cr="0a"x
  18.  
  19. if ~show('l', "gdarexxsupport.library") then
  20.     if ~addlib("gdarexxsupport.library",0,-30) then
  21.             call exit_msg("Please install the gdarexxsupport.library in your libs: directory before running this Genie")
  22.  
  23. CurrentUnits = ppm_GetUnits()
  24.  
  25. select
  26.     when CurrentUnits = 1 then units="inches"
  27.     when CurrentUnits = 2 then units="millimetres"
  28.     otherwise units ="points"
  29.     end
  30.  
  31. mainbox = ppm_ClickOnBox("Click on box to be given a border")
  32. if box=0 then exit_msg("No box selected")
  33. mainpos = ppm_GetBoxPosition(mainbox)
  34. mainXpos = word(mainpos, 1)
  35. mainYpos = word(mainpos, 2)
  36. mainsize = ppm_GetBoxSize(mainbox)
  37. mainangle = ppm_GetBoxAngle(mainbox)
  38.  
  39. breadth =  ppm_GetUserText(6, "Width of border in "units)
  40. if breadth="" then exit_msg("Aborted by User")
  41. if CurrentUnits = 2 then breadth = breadth/10   /* mm to cm */
  42. if CurrentUnits = 3 then breadth = breadth/12   /* points to picas */
  43. mainheight = (word(mainsize, 2))-(breadth*2)
  44. mainwidth = (word(mainsize, 1))-(breadth*2)
  45.  
  46. cornerbox = ppm_ClickOnBox("Click on Box for Corner Units")
  47. if cornerbox ~=0 then do
  48.     csize = ppm_GetBoxSize(cornerbox)
  49.     cXsize = word(csize, 1)
  50.     cYsize = word(csize, 2)
  51.     cscale = ppm_GetBoxScale(cornerbox)
  52.     cscaleX = word(cscale, 1)
  53.     cscaleY = word(cscale, 2)
  54.     cangle = ppm_GetBoxAngle(cornerbox)
  55.     end
  56.  
  57. counter=0
  58.  
  59. do forever
  60.     box=ppm_ClickOnBox("Click on boxes for side units")
  61.     if box=0 then break
  62.     counter=counter+1
  63.     boxes.counter=box
  64.     call ppm_SetBoxAngle(box,0)
  65.     if counter = 5 then break
  66. end
  67.  
  68. sideboxes = counter /* This is the number of different units in the design */
  69.  
  70. do while counter<6
  71.     counter = counter+1
  72.     boxes.counter = boxes.1    /* pad up to 5 */
  73.     end
  74.  
  75.  
  76.  
  77. if Sideboxes>1 then do
  78.     pattern = ppm_GetUserText(Sideboxes*3, Sideboxes" boxes selected. Type in repeat pattern using abBAc etc.")
  79.     if pattern = "" then pattern = "a"
  80.     end
  81. else if Sideboxes = 1 then pattern = "a"
  82.  
  83. /* Place Corner Units */
  84. call ppm_NewGroup()
  85. call ppm_ShowStatus("Placing Corner Units")
  86. if cornerbox ~=0 then do
  87.     cbox = ppm_CloneBox(cornerbox, 0, 0)
  88.     call ppm_AddToGroup(cbox)
  89.     call ppm_SetBoxAngle(cbox,0)
  90.     call ppm_SetBoxSize(cbox, breadth, breadth)
  91.     call ppm_SetBoxScale(cbox, cscaleX*breadth/cXsize, cscaleY*breadth/cYsize)
  92.     call ppm_SetBoxPosition(cbox, mainXpos, mainYpos)
  93.     cbox2 = ppm_CloneBox(cbox, 0, 0)
  94.     call ppm_AddToGroup(cbox2)
  95.     call ppm_SetBoxPosition(cbox2, mainXpos, mainYpos+mainheight+breadth)
  96.     call ppm_SetBoxAngle(cbox2, (cangle+90)//360)
  97.     cbox3 = ppm_CloneBox(cbox, 0, 0)
  98.     call ppm_AddToGroup(cbox3)
  99.     call ppm_SetBoxPosition(cbox3, mainXpos+mainwidth+breadth, mainYpos+mainheight+breadth)
  100.     call ppm_SetBoxAngle(cbox3, (cangle+180)//360)
  101.     cbox4 = ppm_CloneBox(cbox, 0, 0)
  102.     call ppm_AddToGroup(cbox4)
  103.     call ppm_SetBoxPosition(cbox4, mainXpos+mainwidth+breadth, mainYpos)
  104.     call ppm_SetBoxAngle(cbox4, (cangle+270)//360)
  105.     call ppm_SetBoxAngle(cbox, cangle//360)
  106.     end
  107.  
  108.  
  109. if Sideboxes = 0 then exit_msg("Done")
  110.  
  111.     patternlength = length(pattern)
  112.     totalwidth = 0
  113.  
  114.  
  115.     do i=1 to patternlength
  116.         letter = substr(pattern, i, 1)
  117.         select
  118.             when letter = "a" | letter = "A" then repeats.i = ppm_CloneBox(boxes.1, 0, 0)
  119.             when letter = "b" | letter = "B" then repeats.i = ppm_CloneBox(boxes.2, 0, 0)
  120.             when letter = "c" | letter = "C" then repeats.i = ppm_CloneBox(boxes.3, 0, 0)
  121.             when letter = "d" | letter = "D" then repeats.i = ppm_CloneBox(boxes.4, 0, 0)
  122.             when letter = "e" | letter = "E" then repeats.i = ppm_CloneBox(boxes.5, 0, 0)
  123.             otherwise repeats.i = ppm_CloneBox(boxes.1, 0, 0)
  124.             end
  125.  
  126.             if datatype(letter, "upper") then repeats.i.flip = 1
  127.             else repeats.i.flip = 0
  128.  
  129.  
  130. /* Collect original size and graphic scale of each box */
  131.     repeats.i.scaleX = word(ppm_GetBoxScale(repeats.i), 1)
  132.     repeats.i.scaleY = word(ppm_GetBoxScale(repeats.i), 2)
  133.     repeats.i.width = word(ppm_GetBoxSize(repeats.i), 1)
  134.     repeats.i.height = word(ppm_GetBoxSize(repeats.i), 2)
  135.     repeats.i.scale1 = breadth/repeats.i.height
  136.     repeats.i.width2 = repeats.i.width*repeats.i.scale1
  137.     if repeats.i.flip = 1 then repeats.i.scale1 = -repeats.i.scale1
  138.  
  139.     totalwidth = totalwidth+repeats.i.width2   /* width of the whole pattern */
  140. end
  141.  
  142.  
  143. heightcount = mainheight%totalwidth /* Use integer division to get number of repeats */
  144. widthcount = mainwidth%totalwidth
  145. if widthcount = 0 | heightcount = 0 then exit_msg("Pattern too big")
  146.  
  147. Xtotalwidth = mainwidth/widthcount  /* Exact width of whole pattern */
  148. Ytotalwidth = mainheight/heightcount
  149. Xscale = Xtotalwidth/totalwidth
  150. Yscale = Ytotalwidth/totalwidth
  151.  
  152. do i = 1 to patternlength
  153.     repeats.i.widthX = repeats.i.width2*Xscale
  154.     repeats.i.widthY = repeats.i.width2*Yscale 
  155.     end
  156.  
  157.  
  158. /* Place top units  */
  159.  
  160. call ppm_ShowStatus("Placing Top Units")
  161. leftpos = mainXpos+breadth
  162. do j=1 to widthcount
  163. do i=1 to patternlength
  164.     newboxes.i = ppm_CloneBox(repeats.i, 0, 0)
  165.     call ppm_AddToGroup(newboxes.i)
  166.     call ppm_SetBoxSize(newboxes.i, repeats.i.widthX, breadth)
  167.     call ppm_SetBoxPosition(newboxes.i, leftpos, mainYpos)
  168.     call ppm_SetBoxScale(newboxes.i, (repeats.i.scaleX *repeats.i.scale1* Xscale), (repeats.i.scaleY * abs(repeats.i.scale1)) )
  169.     call ppm_SetBoxAngle(newboxes.i, 0)
  170.     leftpos = leftpos+repeats.i.widthX
  171.     end
  172. end
  173.  
  174. /* Place right side units */
  175. call ppm_ShowStatus("Placing Right Side Units")
  176. toppos = mainYpos+breadth
  177. leftpos = mainXpos+word(mainsize, 1)
  178.  
  179. do j=1 to heightcount
  180.     do i=1 to patternlength
  181.         newboxes.i = ppm_CloneBox(repeats.i, 0, 0)
  182.         call ppm_AddToGroup(newboxes.i)
  183.         call ppm_SetBoxAngle(newboxes.i, 270)
  184.         call ppm_SetBoxSize(newboxes.i, repeats.i.widthY, breadth)
  185.         call ppm_SetBoxPosition(newboxes.i, leftpos, toppos)
  186.         call ppm_SetBoxScale(newboxes.i, (repeats.i.scaleX *repeats.i.scale1* Yscale), (repeats.i.scaleY * abs(repeats.i.scale1)) )
  187.         toppos = toppos+repeats.i.widthY
  188.         end 
  189.     end
  190.  
  191.  
  192. /* Place bottom units  */
  193.  
  194. call ppm_ShowStatus("Placing Bottom Units")
  195. leftpos = mainXpos+breadth+mainwidth
  196. toppos = mainYpos+word(mainsize, 2)
  197.  
  198. do j=1 to widthcount
  199. do i=1 to patternlength
  200.     newboxes.i = ppm_CloneBox(repeats.i, 0, 0)
  201.     call ppm_AddToGroup(newboxes.i)
  202.     call ppm_SetBoxAngle(newboxes.i, 180)
  203.     call ppm_SetBoxSize(newboxes.i, repeats.i.widthX, breadth)
  204.     call ppm_SetBoxPosition(newboxes.i, leftpos, toppos)
  205.     call ppm_SetBoxScale(newboxes.i, (repeats.i.scaleX *repeats.i.scale1* Xscale), (repeats.i.scaleY * abs(repeats.i.scale1)) )
  206.     leftpos = leftpos-repeats.i.widthX
  207.     end
  208. end
  209.  
  210. /* Place left side units */
  211. call ppm_ShowStatus("Placing Left Side Units")
  212. toppos = mainYpos+breadth+mainheight
  213. leftpos = mainXpos
  214.  
  215. do j=1 to heightcount
  216.     do i=1 to patternlength
  217.         newboxes.i = ppm_CloneBox(repeats.i, 0, 0)
  218.         call ppm_AddToGroup(newboxes.i)
  219.         call ppm_SetBoxAngle(newboxes.i, 90)
  220.         call ppm_SetBoxSize(newboxes.i, repeats.i.widthY, breadth)
  221.         call ppm_SetBoxPosition(newboxes.i, leftpos, toppos)
  222.         call ppm_SetBoxScale(newboxes.i, (repeats.i.scaleX *repeats.i.scale1* Yscale), (repeats.i.scaleY * abs(repeats.i.scale1)) )
  223.         toppos = toppos-repeats.i.widthY
  224.         end 
  225.     end
  226.  
  227. /* Delete the "repeats" set of boxes  */
  228. do i = 1 to patternlength
  229.     gone = ppm_DeleteBox(repeats.i)
  230.     end
  231.  
  232. /* Set an arbitrary margin in main box  */
  233. margin = breadth*1.5
  234. call ppm_SetBoxMargins(mainbox, margin, margin, margin, margin)
  235.  
  236. /* Rotate border to match main box. This routine is just the Group Rotate genie. */
  237.  
  238. if mainangle~=0 then do
  239.     box     = ppm_GroupFirstBox()
  240.     if box  = 0 then exit_msg("Select a group first")
  241.  
  242.  
  243.     rangle  = mainangle * rad
  244.     cosa    = cos(rangle)
  245.     sina    = sin(rangle)
  246.  
  247.     call ppm_ShowStatus("Rotating..")
  248.  
  249.     grouprect   = ppm_GetGroupRect()
  250.     grpleft     = word(grouprect, 1)
  251.     grptop      = word(grouprect, 2)
  252.  
  253.     do while box ~= 0
  254.  
  255.         boxpos  = ppm_GetBoxPosition(box)
  256.         boxleft = word(boxpos, 1)
  257.         boxtop  = word(boxpos, 2)
  258.  
  259.         newangle = (mainangle + ppm_GetBoxAngle(box))//360
  260.         call ppm_SetBoxAngle(box, newangle )
  261.  
  262.         xoffset = boxleft - grpleft
  263.         yoffset = boxtop - grptop
  264.  
  265.         x   = grpleft + xoffset * cosa + yoffset * sina
  266.         y   = grptop +  yoffset * cosa - xoffset * sina
  267.  
  268.         call ppm_SetBoxPosition(box, x, y)
  269.  
  270.         box = ppm_GroupNextBox(box)
  271.     end
  272. end 
  273.  
  274. call exit_msg()
  275.  
  276. end
  277.  
  278. error:
  279. syntax:
  280.     do
  281.     exit_msg("Genie failed due to error: "errortext(rc))
  282.     end
  283.  
  284. break_d:
  285. break_e:
  286. break_c:
  287. halt:
  288. call exit_msg("Aborted by User")
  289.  
  290. exit_msg:
  291.     do
  292.     parse arg message
  293.     if message ~= "" then
  294.     call ppm_Inform(1, message,"Resume")
  295.     call ppm_ClearStatus()
  296.     call ppm_AutoUpdate(1)
  297.     exit
  298.     end
  299.  
  300.